home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Programming / vbcc / opt.h < prev    next >
C/C++ Source or Header  |  1998-06-24  |  6KB  |  150 lines

  1. /*  $VER: vbcc (opt.h) V0.4     */
  2.  
  3. #include "supp.h"
  4.  
  5. #define BSET(array,bit) (array)[(bit)/CHAR_BIT]|=1<<((bit)%CHAR_BIT)
  6. #define BCLR(array,bit) (array)[(bit)/CHAR_BIT]&=~(1<<((bit)%CHAR_BIT))
  7. #define BTST(array,bit) ((array)[(bit)/CHAR_BIT]&(1<<((bit)%CHAR_BIT)))
  8.  
  9. extern int gchanged;   /*  Merker, ob Optimierungslauf etwas geaendert hat */
  10. extern int norek;      /*  diese Funktion wird nicht rekursiv auf          */
  11. extern int nocall;     /*  diese Funktion kehrt nicht zum Caller zurueck   */
  12.  
  13. /*  temporary fuer verschiedene Bitvektoren */
  14. extern unsigned char *tmp;
  15.  
  16. /*  fuer aktive Variablen   */
  17. extern struct Var **vilist;
  18. extern unsigned int vcount;    /*  0..vcount-rcount-1: vars, vcount-rcount..vcount: DREFOBJs */
  19. extern unsigned int rcount;
  20. extern size_t vsize;
  21. extern unsigned char *av_globals,*av_address,*av_statics,*av_drefs;
  22. extern int report_dead_statements;
  23.  
  24. /*  fuer verfuegbare Definitionen   */
  25. extern unsigned int dcount;
  26. extern size_t dsize;
  27. extern struct IC **dlist;
  28. extern unsigned char **defs;       /*  gibt an, welche Definitionen, welche    */
  29.                             /*  Variablen definieren                    */
  30. /*  alle Definitionen, globaler oder Adr. fuer propagation etc.         */
  31. extern unsigned char *rd_globals,*rd_address,*rd_statics,*rd_drefs;
  32. /*  dasselbe fuer die undefs    */
  33. extern unsigned char *rd_defs,*rd_tmp,*rd_parms,*rd_vars;
  34. /*  Modus fuer reaching_definitions */
  35. extern int rd_mode;
  36.  
  37. /*  fuer verfuegbare Ausdruecke */
  38. extern struct IC **elist;
  39. extern unsigned int ecount;
  40. extern size_t esize;
  41. extern unsigned char *ae_globals,*ae_address,*ae_statics,*ae_drefs;
  42.  
  43. /*  fuer verfuegbare Kopien */
  44. extern unsigned int ccount;
  45. extern size_t csize;
  46. extern struct IC **clist;
  47.  
  48. /*  fuer frequency-reduction    */
  49. extern unsigned char *inloop,*invariant;
  50.  
  51. /*  alle Assignments, globaler oder Adr. fuer propagation etc.         */
  52. extern unsigned char *cp_globals,*cp_address,*cp_statics,*cp_drefs,*cp_act,*cp_dest;
  53. /*  alle Kopieranweisungen, die eine best. Variable als Quelle haben    */
  54. extern unsigned char **copies;
  55.  
  56. extern int have_alias;
  57.  
  58. struct flowgraph{
  59.     struct IC *start,*end;
  60.     struct flowgraph *normalout,*branchout;
  61.     struct flowlist *in;
  62.     int index;
  63.     /*  Letzter Block der Schleife, falls Block Start einer Schleife ist    */
  64.     struct flowgraph *loopend;
  65.     /*  Anzahl Funktionsaufrufe im Block/der Schleife   */
  66.     int calls,loop_calls;
  67.     /*  Bitvektoren fuer aktive Variablen   */
  68.     unsigned char *av_in,*av_out,*av_gen,*av_kill;
  69.     unsigned char *rd_in,*rd_out,*rd_gen,*rd_kill;
  70.     unsigned char *ae_in,*ae_out,*ae_gen,*ae_kill;
  71.     unsigned char *cp_in,*cp_out,*cp_gen,*cp_kill;
  72.     /*  Registervariablen   */
  73.     struct Var *regv[MAXR+1];
  74.     /*  Merker, ob Register gebraucht wurde; MACR+1 Bits    */
  75.     unsigned char regused[(MAXR+CHAR_BIT)/CHAR_BIT];
  76. };
  77.  
  78. extern unsigned int basic_blocks;
  79.  
  80. struct flowlist{
  81.     struct flowgraph *graph;
  82.     struct flowlist *next;
  83. };
  84.  
  85. int bvcmp(unsigned char *dest,unsigned char *src,size_t len);
  86. void bvunite(unsigned char *dest,unsigned char *src,size_t len);
  87. void bvintersect(unsigned char *dest,unsigned char *src,size_t len);
  88. void bvdiff(unsigned char *dest,unsigned char *src,size_t len);
  89. int compare_const(union atyps *q1,union atyps *q2,int t);
  90. int compare_objs(struct obj *o1,struct obj *o2,int t);
  91. void simple_regs(void);
  92. void remove_IC_fg(struct flowgraph *g,struct IC *p);
  93.  
  94. extern int lastlabel;
  95.  
  96. struct flowgraph *construct_flowgraph(void);
  97. void print_av(unsigned char *bitvector);
  98. void print_rd(unsigned char *bitvector);
  99. void print_ae(unsigned char *bitvector);
  100. void print_cp(unsigned char *bitvector);
  101. void print_flowgraph(struct flowgraph *g);
  102. void free_flowgraph(struct flowgraph *g);
  103. void num_vars(void);
  104. void print_vi(void);
  105. void av_change(struct IC *p,unsigned char *use,unsigned char *def);
  106. void active_vars(struct flowgraph *fg);
  107. int dead_assignments(struct flowgraph *fg);
  108. void insert_IC(struct IC *p,struct IC *new);
  109. void insert_IC_fg(struct flowgraph *fg,struct IC *p,struct IC *new);
  110. void insert_allocreg(struct flowgraph *fg,struct IC *p,int code,int reg);
  111.  
  112. extern struct Var *lregv[MAXR+1];
  113. extern struct flowgraph *lfg;
  114.  
  115. extern int report_weird_code,report_suspicious_loops;
  116.  
  117. int replace_local_reg(struct obj *o);
  118. void local_regs(struct flowgraph *fg);
  119. void loop_regs(struct flowgraph *fg);
  120. void block_regs(struct flowgraph *fg);
  121. void insert_saves(void);
  122. struct flowgraph *jump_optimization(void);
  123. void num_defs(void);
  124. void reaching_definitions(struct flowgraph *fg);
  125. void rd_change(struct IC *p);
  126. void calc(int c,int t,union atyps *q1,union atyps *q2,union atyps *z,struct IC *p);
  127. int fold(struct IC *p);
  128. int peephole(void);
  129. int propagate(struct obj *o,int replace);
  130. int constant_propagation(struct flowgraph *fg,int global);
  131. int compare_exp(const void *a1,const void *a2);
  132. void num_exp(void);
  133. void available_expressions(struct flowgraph *fg);
  134. void available_copies(struct flowgraph *fg);
  135. int cse(struct flowgraph *fg,int global);
  136. void num_copies(void);
  137. int copy_propagation(struct flowgraph *fg,int global);
  138. int loops(struct flowgraph *fg,int mode);
  139. struct flowgraph *create_loop_headers(struct flowgraph *fg,int av);
  140. struct flowgraph *create_loop_footers(struct flowgraph *fg,int av);
  141. void insert_regs(struct flowgraph *fg);
  142. void recalc_offsets(struct flowgraph *fg);
  143. void optimize(long flags,struct Var *function);
  144. int loop_optimizations(struct flowgraph *fg);
  145. void ic_uses(struct IC *p,unsigned char *result);
  146. void ic_changes(struct IC *p,unsigned char *result);
  147. void create_alias(struct flowgraph *fg);
  148. void free_alias(struct flowgraph *fg);
  149. void update_alias(struct Var *old,struct Var *new);
  150.